home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Programming / AmigaE / Src / OOmodules / library / device / trackdisk.e < prev   
Encoding:
Text File  |  1995-04-15  |  2.9 KB  |  118 lines

  1. /*
  2.  
  3. Second module for the trackdisk.device. Uses my E-PROCs from 1993 which were
  4. adapted to use the device object.
  5.  
  6. Gregor Goldbach 1st April 1995
  7.  
  8. VISION:
  9.  
  10.  - procs to read/write non-dos tracks
  11.  - open device if not opened already
  12.  
  13.   V2.0    12.4.95   made it fit to 'Object'
  14.                     works
  15. */
  16.  
  17.  
  18. OPT MODULE
  19. OPT OSVERSION=37
  20. OPT EXPORT
  21.  
  22. MODULE  'exec/devices', 'exec/io', 'exec/nodes',
  23.         'exec/ports','exec/devices', 'devices/trackdisk',
  24.         'oomodules/library/device'
  25.  
  26. OBJECT trackdisk OF device
  27.   label[16]:ARRAY OF CHAR
  28.   buffer[512]:ARRAY OF CHAR
  29. ENDOBJECT
  30.  
  31. PROC name() OF trackdisk IS 'Trackdisk'
  32.  
  33. PROC init() OF trackdisk
  34.   self.name := 'trackdisk.device'
  35. ENDPROC
  36.  
  37. PROC motor(flag=FALSE,drive=0) OF trackdisk
  38. DEF wert
  39.  
  40.   IF self.io = NIL THEN self.open('trackdisk.device',drive)
  41.  
  42.   IF flag THEN wert := 1 ELSE wert := 0
  43.    /* ior.iostd.length := 1 -> Motor an */
  44.    /* ior.iostd.length := 0 -> Motor aus */
  45.  
  46.   self.io::iostd.length := wert
  47.   self.io::iostd.command := TD_MOTOR
  48.   self.doio()
  49.  
  50. ENDPROC
  51.  
  52. PROC getchangenum() OF trackdisk
  53.  
  54.   IF self.io = NIL THEN self.open('trackdisk.device')
  55.  
  56.   self.io::iostd.command := TD_CHANGENUM
  57.   self.doio()
  58.   RETURN self.io::iostd.actual /* ior.iostd.actual hier steht nach DoIO die Nummer drin */
  59. ENDPROC
  60.  
  61. PROC readblock(nummer,drive=0) OF trackdisk
  62.  
  63.   IF self.io=NIL THEN self.open('trackdisk.device', drive, 0)
  64.  
  65.   self.io::ioexttd.count := self.getchangenum()
  66.   self.io::iostd.offset := nummer*512           -> der Offset wird in Bytes angegeben, ein Block = 512 Bytes
  67.   self.io::iostd.data := self.buffer
  68.   self.io::iostd.length := TD_SECTOR
  69.   self.io::ioexttd.seclabel := self.label       -> vor jedem Block stehen noch 16 Bytes, sog. Label
  70.   self.io::iostd.command := ETD_READ
  71.   self.doio()
  72.  
  73. ENDPROC self.io::iostd.error
  74.  
  75. PROC writeblock(nummer,drive=0) OF trackdisk
  76. DEF laufvar
  77.  
  78.   IF self.io=NIL THEN self.open('trackdisk.device',drive)
  79.  
  80.   -> set the block's label to 0
  81.   FOR laufvar := 0 TO 15 DO self.label[laufvar]:=0
  82.  
  83.   self.io::ioexttd.count := self.getchangenum()
  84.   self.io::iostd.offset := nummer*512
  85.   self.io::iostd.data := self.buffer
  86.   self.io::iostd.length := TD_SECTOR
  87.   self.io::ioexttd.seclabel := self.label
  88.   self.io::iostd.command := ETD_WRITE
  89.   self.doio()
  90.   self.io::iostd.command := ETD_UPDATE ->nicht nur in den internen Puffer schreiben, sondern sofort abspeichern
  91.   self.doio()
  92.  
  93. ENDPROC self.io::iostd.error
  94.  
  95. PROC diskindrive(drive=0) OF trackdisk
  96. -> disk in drive?
  97.  
  98.   IF self.io=NIL THEN self.open('trackdisk.device', drive)
  99.  
  100.   self.io::iostd.command := TD_CHANGESTATE
  101.   self.doio()
  102.   IF(self.io::iostd.actual = 0) THEN RETURN(TRUE) ELSE RETURN(FALSE)
  103.   /* wenn eine Diskette drin ist, ist ioreq.iostd.actual == 0! */
  104.  
  105. ENDPROC
  106.  
  107.  
  108. PROC diskprotected(drive=0) OF trackdisk
  109. -> disk write protected?
  110.  
  111.   IF self.io=NIL THEN self.open('trackdisk.device', drive)
  112.  
  113.   self.io::iostd.command := TD_PROTSTATUS
  114.   self.doio()
  115.   RETURN(self.io::iostd.actual)
  116.  
  117. ENDPROC
  118.